AWS IoTのCloudWatch Logsログ出力を新形式にアップグレードする
AWS IoTではデバイスから送信されたメッセージをCloudWatch Logsにロギング出来ます。 本機能は、2017年11月29日頃から新しいメッセージ形式でも出力できるようになりました。
本ブログでは、旧形式で出力されているログを新形式に変更する方法を紹介します。
アップグレードの狙い
新旧のログ出力の機能の違い
旧形式 | 新形式 | |
---|---|---|
フォーマット | プレーンテキスト | JSON |
ログレベル | ログ記録レベルはグローバルに1種類のみ | 特定のモノのグループごとにログ記録レベルを指定可能 |
ログ記録のレイテンシー | 高い | 低い |
API | set-logging-options get-logging-options |
set-v2-logging-level set-v2-logging-options get-v2-logging-options delete-v2-logging-level |
APIコマンドの強化予定 | なし | あり |
CloudWatch ロググループ | AWSIotLogs | AWSIotLogsV2 |
旧形式のコマンドは更新予定がなく、新形式は機能が豊富であることから、AWS管理コンソールの AWS IOTコア→設定に移動すると、次のキャプチャーのようにアップグレードを促すメッセージが表示されます。
旧形式でログ出力されるケース
新形式リリース後にログ出力を有効すると、新形式でログ出力されます。
以下の様なケースでは、ログが旧形式で出力されます。
- 新形式リリース前にログ出力を有効化
- 旧ログ形式向けAPI(
set-logging-options
)を利用してログ出力を有効化
現在のログバージョンの確認
管理コンソールから確認
管理コンソールからAWS IOTコア→設定と遷移し、ログ形式アップグレードのメッセージが表示される場合、旧形式でログ出力されています。
ダブルチェックのため、以下も確認してください。
CloudWatch Logsで
- ロググループが AWSIotLogs
- ログフォーマットがJSONではなくプレーンテキスト
API から確認
旧形式でログ設定されている場合、ログ設定を確認する API を投げたときに、旧形式は設定がかえり、新形式は NotConfiguredException
エラーが発生します。
# 旧形式向け $ aws iot get-logging-options { "roleArn": "arn:aws:iam::205974338614:role/service-role/AWSIoTLogging", "logLevel": "INFO" } # 新形式向け $ aws iot get-v2-logging-options An error occurred (NotConfiguredException) when calling the GetV2LoggingOptions operation: SetV2LoggingOptions was not previously called. No logging options have been set.
ログ形式のアップグレード
管理コンソールからアップグレード
管理コンソールからAWS IOTコア→設定と遷移し、ログ形式アップグレードのメッセージが表示される場合、「アップグレード」のボタンを押すだけでアップグレード完了です。
旧形式のログレベルによらず、「警告(WARN)」レベルで有効化されるようです。 ログレベルは適宜修正してください。
API からアップグレード
iot set-v2-logging-options
API を使い、
- AWS IoTがCloudWatch Logsにログ出力するためのロールのARN(旧ログのロールを使いまわしてOK)
- デフォルトログレベル
を指定します。
$ aws iot set-v2-logging-options \ --role-arn arn:aws:iam::12345:role/service-role/AWSIoTLogging \ --default-log-level WARN
アップデート後
$ aws iot get-v2-logging-options { "roleArn": "arn:aws:iam::12345:role/service-role/AWSIoTLogging", "defaultLogLevel": "WARN", "disableAllLogs": false }
ログフォーマットの違い
参考までに、ログフォーマットの違いを確認します。
旧形式のログ出力例
旧形式はプレーンテキストです
2018-12-22 15:18:06.252 TRACEID:75f582b5-7849-b94a-aea3-b11c9b15eedc PRINCIPALID:XXX [INFO] EVENT:MQTTClient Subscribe TOPICNAME:$aws/events/presence/connected/MyIoTDevice MESSAGE:Subscribe Status: SUCCESS 2018-12-22 15:18:06.252 TRACEID:75f582b5-7849-b94a-aea3-b11c9b15eedc PRINCIPALID:XXX [INFO] EVENT:MQTTClient Subscribe MESSAGE: IpAddress: 2003:45:4636:... SourcePort: 52599
新形式のログ出力例
新形式はJSONペイロードです。
{ "timestamp": "2017-08-10 15:39:30.961", "logLevel": "INFO", "traceId": "672ec480-31ce-fd8b-b5fb-22e3ac420699", "accountId": "123456789012", "status": "Success", "eventType": "Publish-In", "protocol": "MQTT", "topicName": "$aws/things/MyThing/shadow/get", "clientId": "abf27092886e49a8a5c1922749736453", "principalId": "145179c40e2219e18a909d896a5340b74cf97a39641beec2fc3eeafc5a932167", "sourceIp": "205.251.233.181", "sourcePort": 13490 }